﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Geo.Emphasis
{
	/// <summary>
	/// Object
	/// </summary>
	public class Label
	{

		/// <summary>
		/// boolean
		/// 是否显示标签。
		/// </summary>
		public Boolean show { get; set; } = false;

		/// <summary>
		/// string,Array
		/// 标签的位置。
		/// 可选：
		/// [x, y]
		///   通过相对的百分比或者绝对像素值表示标签相对于图形包围盒左上角的位置。
		///   示例：
		///   // 绝对的像素值
		///   position: [10, 10],
		///   // 相对的百分比
		///   position: ['50%', '50%']
		/// 'top'
		/// 'left'
		/// 'right'
		/// 'bottom'
		/// 'inside'
		/// 'insideLeft'
		/// 'insideRight'
		/// 'insideTop'
		/// 'insideBottom'
		/// 'insideTopLeft'
		/// 'insideBottomLeft'
		/// 'insideTopRight'
		/// 'insideBottomRight'
		/// 参见：label position。
		/// </summary>
		public dynamic position { get; set; }

		/// <summary>
		/// number
		/// 距离图形元素的距离。当 position 为字符描述值（如 'top'、'insideRight'）时候有效。
		/// 参见：label position。
		/// </summary>
		public int distance { get; set; } = 5;

		/// <summary>
		/// number
		/// 标签旋转。从 -90 度到 90 度。正值是逆时针。
		/// 参见：label rotation。
		/// </summary>
		public int? rotate { get; set; }

		/// <summary>
		/// Array
		/// 是否对文字进行偏移。默认不偏移。例如：[30, 40] 表示文字在横向上偏移 30，纵向上偏移 40。
		/// </summary>
		public List<object> offset { get; set; }

		/// <summary>
		/// string,Function
		/// 标签内容格式器，支持字符串模板和回调函数两种形式，字符串模板与回调函数返回的字符串均支持用 \n 换行。
		/// 字符串模板
		/// 模板变量有：
		/// {a}：系列名。
		/// {b}：数据名。
		/// {c}：数据值。
		/// {@xxx}：数据中名为'xxx'的维度的值，如{@product}表示名为'product'` 的维度的值。
		/// {@[n]}：数据中维度n的值，如{@[3]}` 表示维度 3 的值，从 0 开始计数。
		/// 示例：
		/// formatter: '{b}: {@score}'
		/// 回调函数
		/// 回调函数格式：
		/// (params: Object|Array) => string
		/// 参数 params 是 formatter 需要的单个数据集。格式如下：
		/// {
		///     componentType: 'series',
		///     // 系列类型
		///     seriesType: string,
		///     // 系列在传入的 option.series 中的 index
		///     seriesIndex: number,
		///     // 系列名称
		///     seriesName: string,
		///     // 数据名，类目名
		///     name: string,
		///     // 数据在传入的 data 数组中的 index
		///     dataIndex: number,
		///     // 传入的原始数据项
		///     data: Object,
		///     // 传入的数据值。在多数系列下它和 data 相同。在一些系列下是 data 中的分量（如 map、radar 中）
		///     value: number|Array|Object,
		///     // 坐标轴 encode 映射信息，
		///     // key 为坐标轴（如 'x' 'y' 'radius' 'angle' 等）
		///     // value 必然为数组，不会为 null/undefied，表示 dimension index 。
		///     // 其内容如：
		///     // {
		///     //     x: [2] // dimension index 为 2 的数据映射到 x 轴
		///     //     y: [0] // dimension index 为 0 的数据映射到 y 轴
		///     // }
		///     encode: Object,
		///     // 维度名列表
		///     dimensionNames: Array<String>,
		///     // 数据的维度 index，如 0 或 1 或 2 ...
		///     // 仅在雷达图中使用。
		///     dimensionIndex: number,
		///     // 数据图形的颜色
		///     color: string,
		/// }
		/// 注：encode 和 dimensionNames 的使用方式，例如：
		/// 如果数据为：
		/// dataset: {
		///     source: [
		///         ['Matcha Latte', 43.3, 85.8, 93.7],
		///         ['Milk Tea', 83.1, 73.4, 55.1],
		///         ['Cheese Cocoa', 86.4, 65.2, 82.5],
		///         ['Walnut Brownie', 72.4, 53.9, 39.1]
		///     ]
		/// }
		/// 则可这样得到 y 轴对应的 value：
		/// params.value[params.encode.y[0]]
		/// 如果数据为：
		/// dataset: {
		///     dimensions: ['product', '2015', '2016', '2017'],
		///     source: [
		///         {product: 'Matcha Latte', '2015': 43.3, '2016': 85.8, '2017': 93.7},
		///         {product: 'Milk Tea', '2015': 83.1, '2016': 73.4, '2017': 55.1},
		///         {product: 'Cheese Cocoa', '2015': 86.4, '2016': 65.2, '2017': 82.5},
		///         {product: 'Walnut Brownie', '2015': 72.4, '2016': 53.9, '2017': 39.1}
		///     ]
		/// }
		/// 则可这样得到 y 轴对应的 value：
		/// params.value[params.dimensionNames[params.encode.y[0]]]
		/// 。
		/// </summary>
		public dynamic formatter { get; set; }

		/// <summary>
		/// Color
		/// 文字的颜色。
		/// 如果设置为 'auto'，则为视觉映射得到的颜色，如系列色。
		/// </summary>
		public String color { get; set; } = "#fff";

		/// <summary>
		/// string
		/// 文字字体的风格
		/// 可选：
		/// 'normal'
		/// 'italic'
		/// 'oblique'
		/// </summary>
		public FontStyle fontStyle { get; set; } = FontStyle.normal;

		/// <summary>
		/// string
		/// 文字字体的粗细
		/// 可选：
		/// 'normal'
		/// 'bold'
		/// 'bolder'
		/// 'lighter'
		/// 100 | 200 | 300 | 400...
		/// </summary>
		public dynamic fontWeight { get; set; } = FontWeight.normal;

		/// <summary>
		/// string
		/// 文字的字体系列
		/// 还可以是 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ...
		/// </summary>
		public String fontFamily { get; set; } = "sans-serif";

		/// <summary>
		/// number
		/// 文字的字体大小
		/// </summary>
		public int fontSize { get; set; } = 12;

		/// <summary>
		/// string
		/// </summary>
		public Align align { get; set; }

		/// <summary>
		/// string
		/// </summary>
		public VerticalAlign verticalAlign { get; set; }

		/// <summary>
		/// number
		/// 行高。
		/// rich 中如果没有设置 lineHeight，则会取父层级的 lineHeight。例如：
		/// {
		///     lineHeight: 56,
		///     rich: {
		///         a: {
		///             // 没有设置 `lineHeight`，则 `lineHeight` 为 56
		///         }
		///     }
		/// }
		/// </summary>
		public int? lineHeight { get; set; }

		/// <summary>
		/// string,Object
		/// 文字块背景色。
		/// 可以是直接的颜色值，例如：'#123234', 'red', 'rgba(0,23,11,0.3)'。
		/// 可以支持使用图片，例如：
		/// backgroundColor: {
		///     image: 'xxx/xxx.png'
		///     // 这里可以是图片的 URL，
		///     // 或者图片的 dataURI，
		///     // 或者 HTMLImageElement 对象，
		///     // 或者 HTMLCanvasElement 对象。
		/// }
		/// 当使用图片的时候，可以使用 width 或 height 指定高宽，也可以不指定自适应。
		/// 如果设置为 'auto'，则为视觉映射得到的颜色，如系列色。
		/// </summary>
		public dynamic backgroundColor { get; set; } = "transparent";

		/// <summary>
		/// string
		/// 文字块边框颜色。
		/// 如果设置为 'auto'，则为视觉映射得到的颜色，如系列色。
		/// </summary>
		public String borderColor { get; set; } = "transparent";

		/// <summary>
		/// number
		/// 文字块边框宽度。
		/// </summary>
		public int borderWidth { get; set; } = 0;

		/// <summary>
		/// number,Array
		/// 文字块的圆角。
		/// </summary>
		public dynamic borderRadius { get; set; } = 0;

		/// <summary>
		/// number,Array
		/// 文字块的内边距。例如：
		/// padding: [3, 4, 5, 6]：表示 [上, 右, 下, 左] 的边距。
		/// padding: 4：表示 padding: [4, 4, 4, 4]。
		/// padding: [3, 4]：表示 padding: [3, 4, 3, 4]。
		/// 注意，文字块的 width 和 height 指定的是内容高宽，不包含 padding。
		/// </summary>
		public dynamic padding { get; set; } = 0;

		/// <summary>
		/// string
		/// 文字块的背景阴影颜色。
		/// </summary>
		public String shadowColor { get; set; } = "transparent";

		/// <summary>
		/// number
		/// 文字块的背景阴影长度。
		/// </summary>
		public int shadowBlur { get; set; } = 0;

		/// <summary>
		/// number
		/// 文字块的背景阴影 X 偏移。
		/// </summary>
		public int shadowOffsetX { get; set; } = 0;

		/// <summary>
		/// number
		/// 文字块的背景阴影 Y 偏移。
		/// </summary>
		public int shadowOffsetY { get; set; } = 0;

		/// <summary>
		/// number,string
		/// 文字块的宽度。一般不用指定，不指定则自动是文字的宽度。在想做表格项或者使用图片（参见 backgroundColor）时，可能会使用它。
		/// 注意，文字块的 width 和 height 指定的是内容高宽，不包含 padding。
		/// width 也可以是百分比字符串，如 '100%'。表示的是所在文本块的 contentWidth（即不包含文本块的 padding）的百分之多少。之所以以 contentWidth 做基数，因为每个文本片段只能基于 content box 布局。如果以 outerWidth 做基数，则百分比的计算在实用中不具有意义，可能会超出。
		/// 注意，如果不定义 rich 属性，则不能指定 width 和 height。
		/// </summary>
		public dynamic width { get; set; }

		/// <summary>
		/// number,string
		/// 文字块的高度。一般不用指定，不指定则自动是文字的高度。在使用图片（参见 backgroundColor）时，可能会使用它。
		/// 注意，文字块的 width 和 height 指定的是内容高宽，不包含 padding。
		/// 注意，如果不定义 rich 属性，则不能指定 width 和 height。
		/// </summary>
		public dynamic height { get; set; }

		/// <summary>
		/// string
		/// 文字本身的描边颜色。
		/// 如果设置为 'auto'，则为视觉映射得到的颜色，如系列色。
		/// </summary>
		public String textBorderColor { get; set; } = "transparent";

		/// <summary>
		/// number
		/// 文字本身的描边宽度。
		/// </summary>
		public int textBorderWidth { get; set; } = 0;

		/// <summary>
		/// string
		/// 文字本身的阴影颜色。
		/// </summary>
		public String textShadowColor { get; set; } = "transparent";

		/// <summary>
		/// number
		/// 文字本身的阴影长度。
		/// </summary>
		public int textShadowBlur { get; set; } = 0;

		/// <summary>
		/// number
		/// 文字本身的阴影 X 偏移。
		/// </summary>
		public int textShadowOffsetX { get; set; } = 0;

		/// <summary>
		/// number
		/// 文字本身的阴影 Y 偏移。
		/// </summary>
		public int textShadowOffsetY { get; set; } = 0;

		/// <summary>
		/// Object
		/// 在 rich 里面，可以自定义富文本样式。利用富文本样式，可以在标签中做出非常丰富的效果。
		/// 例如：
		/// label: {
		///     // 在文本中，可以对部分文本采用 rich 中定义样式。
		///     // 这里需要在文本中使用标记符号：
		///     // `{styleName|text content text content}` 标记样式名。
		///     // 注意，换行仍是使用 '\n'。
		///     formatter: [
		///         '{a|这段文本采用样式a}',
		///         '{b|这段文本采用样式b}这段用默认样式{x|这段用样式x}'
		///     ].join('\n'),
		///     rich: {
		///         a: {
		///             color: 'red',
		///             lineHeight: 10
		///         },
		///         b: {
		///             backgroundColor: {
		///                 image: 'xxx/xxx.jpg'
		///             },
		///             height: 40
		///         },
		///         x: {
		///             fontSize: 18,
		///             fontFamily: 'Microsoft YaHei',
		///             borderColor: '#449933',
		///             borderRadius: 4
		///         },
		///         ...
		///     }
		/// }
		/// 详情参见教程：富文本标签
		/// </summary>
		public dynamic rich { get; set; }

	}
}
